﻿using Irony.Parsing;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AppServidor
{
    class ProcesadorXml
    {

        public static PeticionAndroid procesar_respuesta(string xml) {
            LanguageData lenguaje = new LanguageData(new XmlGrammar());
            Parser p = new Parser(lenguaje);
            ParseTree arbol = p.Parse(xml);
            if (arbol.Root != null) {
                PeticionAndroid respuesta = new PeticionAndroid();
                analizar(arbol.Root, respuesta);
                return respuesta;
            }

            return null;
        
        }

        private static void analizar(ParseTreeNode s, PeticionAndroid r) {
            if (s != null && s.ChildNodes.Count > 0) {
                nodo(s.ChildNodes[0], r);
            
            }
        
        
        }


        private static void lnodo(ParseTreeNode s, PeticionAndroid r)
        {
            if (s != null && s.ChildNodes.Count > 0)
            {
                ParseTreeNodeList nodod = s.ChildNodes;
                if (nodod.Count > 1) {
                    lnodo(nodod[0], r);
                    nodo(nodod[1], r);
                }
                if (nodod.Count == 1)
                {
                  
                    nodo(nodod[0], r);
                }
               
            }


        }

        private static void nodo(ParseTreeNode s, PeticionAndroid r)
        {
            if (s != null && s.ChildNodes.Count > 0)
            {
                ParseTreeNodeList element = s.ChildNodes;
                if (element.Count == 3) {
                    ParseTreeNode nombre = element[0];
                    String name=nombre.FindTokenAndGetText();
                    if ("solicitud".Equals(name.ToLower())) {
                        ParseTreeNode nodox = element[1];
                         name = nodox.ToString();
                         if ("lnodo".Equals(name))
                         {
                             lnodo(nodox, r);
                         }
                        
                         if ("nodo".Equals(name))
                             {
                                 nodo(nodox, r);

                             }
                         if ("valor".Equals(name))
                         {
                            

                         }
                         
                         
                    }
                    if ("tipo".Equals(name.ToLower()))
                    {
                        ParseTreeNode nodox = element[1];
                        name = nodox.ToString();
                        if ("lnodo".Equals(name))
                        {
                            lnodo(nodox, r);
                        }

                        if ("nodo".Equals(name))
                        {
                            nodo(nodox, r);

                        }
                        if ("valor".Equals(name))
                        {
                            String val = nodox.FindTokenAndGetText();
                            r.Tipo = val.Replace("\"","");
                            if ("pistanueva".Equals(val)) {
                                r.Pista = new Pista();
                            }

                        }


                    }
                    if ("nombre".Equals(name.ToLower()))
                    {
                        ParseTreeNode nodox = element[1];
                        name = nodox.ToString();
                        if ("lnodo".Equals(name))
                        {
                            lnodo(nodox, r);
                        }

                        if ("nodo".Equals(name))
                        {
                            nodo(nodox, r);

                        }
                        if ("valor".Equals(name))
                        {
                            String val = nodox.FindTokenAndGetText();
                            r.Nombre = val.Replace("\"", "");
                            if (r.Pista != null) {
                                r.Pista.Nombre=r.Nombre;
                            }

                        }


                    }

                    if ("datos".Equals(name.ToLower()))
                    {
                        ParseTreeNode lnodoini = element[1];

                        ParseTreeNode ncanal = lnodoini.ChildNodes[0].ChildNodes[0].ChildNodes[0].ChildNodes[0];
                        ParseTreeNode nnota =  lnodoini.ChildNodes[0].ChildNodes[0].ChildNodes[1];
                        ParseTreeNode nocta =  lnodoini.ChildNodes[0].ChildNodes[1];
                        ParseTreeNode ndura =  lnodoini.ChildNodes[1];

                        String canal = ncanal.ChildNodes[1].FindTokenAndGetText();
                        string nota = nnota.ChildNodes[1].FindTokenAndGetText();
                        string octa = nocta.ChildNodes[1].FindTokenAndGetText();
                        string dura = ndura.ChildNodes[1].FindTokenAndGetText();
                        if (r.Pista != null) {
                            r.Pista.add(nota.Replace("\"",""), int.Parse(octa), int.Parse(dura), int.Parse(canal));
                        }
                    }
                }

            }


        }


    }
}
